perm filename DV.PSC[MF,ALS] blob
sn#786586 filedate 1985-02-27 generic text, type T, neo UTF8
{3:}{$D+,W+}PROGRAM DVIIMP(DVIFILE,IMFILE);LABEL{4:}9999,30;{:4}
CONST{5:}MAXFONTS=30;MAXGLYPHS=3840;LINELENGTH=320;TERMINALLINE=150;
STACKSIZE=100;NAMESIZE=1000;NAMELENGTH=50;MNUM=3;MMNUM=4;
MSTORESIZE=88000;MAXCHARNO=127;{:5}TYPE{8:}ASCIICODE=32..126;{:8}{9:}
TEXTFILE=PACKED FILE OF CHAR;{:9}{23:}EIGHTBITS=0..255;
BYTEFILE=PACKED FILE OF EIGHTBITS;{:23}VAR{10:}
XORD:ARRAY[CHAR]OF ASCIICODE;XCHR:ARRAY[0..255]OF CHAR;{:10}{24:}
DVIFILE:BYTEFILE;GFFILE:BYTEFILE;IMFILE:BYTEFILE;{:24}{27:}
CURLOC:INTEGER;CURGFLOC:INTEGER;
CURNAME:PACKED ARRAY[1..NAMELENGTH]OF CHAR;IMBYTENO:INTEGER;{:27}{40:}
FONTNUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTMVAL:ARRAY[0..MAXFONTS]OF INTEGER;
FONTNAME:ARRAY[0..MAXFONTS]OF 0..NAMESIZE;
NAMES:ARRAY[0..NAMESIZE]OF ASCIICODE;
FONTCHECKSUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSCALEDSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTDESIGNSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSPACE:ARRAY[0..MAXFONTS]OF INTEGER;
FONTBC:ARRAY[0..MAXFONTS]OF INTEGER;FONTEC:ARRAY[0..MAXFONTS]OF INTEGER;
DATABASE:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTH:ARRAY[0..MAXGLYPHS]OF INTEGER;NF:0..MAXFONTS;
WIDTHPTR:0..MAXGLYPHS;BC,EC:INTEGER;
WBYTE:ARRAY[0..MAXCHARNO,0..3]OF EIGHTBITS;
GFPTR:ARRAY[0..MAXCHARNO]OF INTEGER;{:40}{44:}GFCHECKSUM:INTEGER;{:44}
{49:}DESIGNSIZE:INTEGER;HPPP,VPPP:INTEGER;CHECKSUM:INTEGER;
GFPOSTLOC:INTEGER;MAGNIFICATIO:REAL;
TFMWIDTH:ARRAY[0..MAXCHARNO]OF INTEGER;DX:ARRAY[0..MAXCHARNO]OF INTEGER;
DY:INTEGER;TOTALGLYPHS:INTEGER;
MSTORE:PACKED ARRAY[0..MNUM,0..MSTORESIZE]OF EIGHTBITS;
SI:ARRAY[0..MNUM]OF INTEGER;GFPREVPTR:INTEGER;CHARCODE:INTEGER;
GLYPHPTR:ARRAY[0..MAXGLYPHS]OF INTEGER;MAXM,MINM,MAXN,MINN:INTEGER;{:49}
{55:}PIXELWIDTH:ARRAY[0..MAXGLYPHS]OF INTEGER;CONV:REAL;TRUECONV:REAL;
NUMERATOR,DENOMINATOR:INTEGER;MAG:INTEGER;{:55}{66:}OUTMODE:0..3;
MAXPAGES:INTEGER;RESOLUTION:REAL;NEWMAG:INTEGER;{:66}{67:}
STARTCOUNT:ARRAY[0..9]OF INTEGER;STARTTHERE:ARRAY[0..9]OF BOOLEAN;
STARTVALS:0..9;COUNT:ARRAY[0..9]OF INTEGER;{:67}{70:}
BUFFER:ARRAY[0..TERMINALLINE]OF ASCIICODE;{:70}{73:}
BUFPTR:0..TERMINALLINE;{:73}{82:}FONTSTATE:ARRAY[0..MAXFONTS]OF INTEGER;
INPOSTAMBLE:BOOLEAN;SCALEVAL:ARRAY[0..12]OF INTEGER;{:82}{91:}
DEFAULTDIREC:PACKED ARRAY[1..8]OF CHAR;{:91}{94:}
ATAB:ARRAY[1..8]OF INTEGER;BTAB:ARRAY[0..8]OF INTEGER;SHOWFLAG:BOOLEAN;
{:94}{103:}TEXTPTR:0..LINELENGTH;
TEXTBUF:ARRAY[1..LINELENGTH]OF ASCIICODE;{:103}{108:}
H,V,W,X,Y,Z,HH,HHI,VV,VVI:INTEGER;
HSTACK,VSTACK,WSTACK,XSTACK,YSTACK,ZSTACK:ARRAY[0..STACKSIZE]OF INTEGER;
HHSTACK,VVSTACK:ARRAY[0..STACKSIZE]OF INTEGER;{:108}{109:}MAXV:INTEGER;
MAXH:INTEGER;MAXS:INTEGER;MAXVSOFAR,MAXHSOFAR,MAXSSOFAR:INTEGER;
TOTALPAGES:INTEGER;PAGECOUNT:INTEGER;{:109}{114:}S:INTEGER;SS:INTEGER;
CURFONT:INTEGER;SHOWING:BOOLEAN;{:114}{134:}OLDBACKPOINT:INTEGER;
NEWBACKPOINT:INTEGER;STARTED:BOOLEAN;{:134}{138:}POSTLOC:INTEGER;
FIRSTBACKPOI:INTEGER;STARTLOC:INTEGER;{:138}{146:}
DVINAME:PACKED ARRAY[1..24]OF CHAR;DVINLEN:1..24;
PPN:RECORD CASE INTEGER OF 1:(INT:INTEGER);
2:(SIXBIT:PACKED ARRAY[1..6]OF 0..63)END;SUCCESS:BOOLEAN;
K,M,N,P,Q:INTEGER;IDLEN:0..255;ID:PACKED ARRAY[0..255]OF 0..255;{:146}
PROCEDURE INITIALIZE;VAR I,J:INTEGER;JJ:REAL;
BEGIN WRITELN(TTY,'This is DVIIMP, Version 0.1');{11:}
FOR I:=0 TO 31 DO XCHR[I]:='?';XCHR[32]:=' ';XCHR[33]:='!';
XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';
XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';
XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';
XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';
XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';
XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';
XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';
XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';
XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';
XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';
XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';
XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';
XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';
XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';XCHR[102]:='f';
XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';XCHR[106]:='j';
XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';XCHR[110]:='n';
XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';XCHR[114]:='r';
XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';XCHR[118]:='v';
XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';XCHR[122]:='z';
XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';XCHR[126]:='~';
FOR I:=127 TO 255 DO XCHR[I]:='?';{:11}{12:}
FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;
FOR I:=32 TO 126 DO XORD[XCHR[I]]:=I;{:12}{41:}NF:=0;WIDTHPTR:=0;
FONTNAME[0]:=0;FONTSPACE[0]:=0;{:41}{50:}
FOR I:=0 TO MAXGLYPHS DO GLYPHPTR[I]:=-1;TOTALGLYPHS:=0;
FOR I:=0 TO 3 DO SI[I]:=0;{:50}{68:}OUTMODE:=0;MAXPAGES:=1000;
STARTVALS:=0;STARTTHERE[0]:=FALSE;RESOLUTION:=300.0;NEWMAG:=0;{:68}{83:}
INPOSTAMBLE:=FALSE;JJ:=1.0;FOR I:=1 TO 7 DO BEGIN JJ:=1.2*JJ;
SCALEVAL[I]:=ROUND(JJ*RESOLUTION);
WRITELN(TTY,' i=',I:1,' jj=',JJ:1,' scale val=',SCALEVAL[I]:1);END;
SCALEVAL[8]:=4*ROUND(RESOLUTION);SCALEVAL[9]:=5*ROUND(RESOLUTION);
SCALEVAL[10]:=6*ROUND(RESOLUTION);SCALEVAL[11]:=7*ROUND(RESOLUTION);
SCALEVAL[12]:=8*ROUND(RESOLUTION);{:83}{92:}DEFAULTDIREC:='[GF,SYS]';
{:92}{95:}SHOWFLAG:=FALSE;ATAB[1]:=128;BTAB[0]:=255;
FOR I:=2 TO 8 DO ATAB[I]:=ATAB[I-1]DIV 2;
FOR I:=1 TO 8 DO BTAB[I]:=BTAB[I-1]DIV 2;{:95}{104:}TEXTPTR:=0;{:104}
{110:}MAXV:=2147483548;MAXH:=2147483548;MAXS:=STACKSIZE+1;MAXVSOFAR:=0;
MAXHSOFAR:=0;MAXSSOFAR:=0;PAGECOUNT:=0;{:110}{135:}OLDBACKPOINT:=-1;
STARTED:=FALSE;{:135}END;{:3}{7:}PROCEDURE JUMPOUT;BEGIN GOTO 9999;END;
{:7}{25:}PROCEDURE OPENDVIFILE;BEGIN RESET(DVIFILE,'','/B:8/N:9');
CURLOC:=0;END;PROCEDURE OPENGFFILE;
BEGIN RESET(GFFILE,CURNAME,'/B:8/O/N:9');CURGFLOC:=0;END;
PROCEDURE CURNAM(VAR CHAN:FILE;VAR S:STRING);EXTERN;{:25}{26:}
PROCEDURE OPENIMFILE;BEGIN REWRITE(IMFILE,'','/B:8/N:9');IMBYTENO:=0;
END;{:26}{28:}FUNCTION GFBYTE:INTEGER;VAR B:EIGHTBITS;
BEGIN IF EOF(GFFILE)THEN GFBYTE:=0 ELSE BEGIN READ(GFFILE,B);
CURGFLOC:=CURGFLOC+1;GFBYTE:=B;END;END;FUNCTION GFTWOBYTES:INTEGER;
VAR A,B:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
CURGFLOC:=CURGFLOC+2;GFTWOBYTES:=A*256+B;END;
FUNCTION GFTHREEBYTES:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(GFFILE,A);
READ(GFFILE,B);READ(GFFILE,C);CURGFLOC:=CURGFLOC+3;
GFTHREEBYTES:=(A*256+B)*256+C;END;FUNCTION GFSIGNEDQUAD:INTEGER;
VAR A,B,C,D:EIGHTBITS;BEGIN READ(GFFILE,A);READ(GFFILE,B);
READ(GFFILE,C);READ(GFFILE,D);CURGFLOC:=CURGFLOC+4;
IF A<128 THEN GFSIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE GFSIGNEDQUAD:=(
((A-256)*256+B)*256+C)*256+D;END;{:28}{29:}FUNCTION GETBYTE:INTEGER;
VAR B:EIGHTBITS;
BEGIN IF EOF(DVIFILE)THEN GETBYTE:=0 ELSE BEGIN READ(DVIFILE,B);
CURLOC:=CURLOC+1;GETBYTE:=B;END;END;FUNCTION SIGNEDBYTE:INTEGER;
VAR B:EIGHTBITS;BEGIN READ(DVIFILE,B);CURLOC:=CURLOC+1;
IF B<128 THEN SIGNEDBYTE:=B ELSE SIGNEDBYTE:=B-256;END;
FUNCTION GETTWOBYTES:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;GETTWOBYTES:=A*256+B;END;
FUNCTION SIGNEDPAIR:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;
IF A<128 THEN SIGNEDPAIR:=A*256+B ELSE SIGNEDPAIR:=(A-256)*256+B;END;
FUNCTION GETTHREEBYTE:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);READ(DVIFILE,C);CURLOC:=CURLOC+3;
GETTHREEBYTE:=(A*256+B)*256+C;END;FUNCTION SIGNEDTRIO:INTEGER;
VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);READ(DVIFILE,B);
READ(DVIFILE,C);CURLOC:=CURLOC+3;
IF A<128 THEN SIGNEDTRIO:=(A*256+B)*256+C ELSE SIGNEDTRIO:=((A-256)*256+
B)*256+C;END;FUNCTION SIGNEDQUAD:INTEGER;VAR A,B,C,D:EIGHTBITS;
BEGIN READ(DVIFILE,A);READ(DVIFILE,B);READ(DVIFILE,C);READ(DVIFILE,D);
CURLOC:=CURLOC+4;
IF A<128 THEN SIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE SIGNEDQUAD:=(((A
-256)*256+B)*256+C)*256+D;END;{:29}{30:}FUNCTION DVILENGTH:INTEGER;
BEGIN SETPOS(DVIFILE,-1);DVILENGTH:=CURPOS(DVIFILE);END;
PROCEDURE MOVETOBYTE(N:INTEGER);BEGIN SETPOS(DVIFILE,N);CURLOC:=N;END;
{:30}{31:}FUNCTION GFLENGTH:INTEGER;BEGIN SETPOS(GFFILE,-1);
GFLENGTH:=CURPOS(GFFILE);END;PROCEDURE MOVETOGFBYTE(N:INTEGER);
BEGIN SETPOS(GFFILE,N);CURGFLOC:=N;END;{:31}{32:}
PROCEDURE IMSBYTE(W:INTEGER);BEGIN IF W<0 THEN W:=W+256;
BEGIN WRITE(IMFILE,W);IMBYTENO:=IMBYTENO+1;END;END;
PROCEDURE IMHALFWORD(W:INTEGER);BEGIN IF W<0 THEN W:=W+65536;
BEGIN WRITE(IMFILE,W DIV 256);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,W MOD 256);IMBYTENO:=IMBYTENO+1;END;END;{:32}{42:}
PROCEDURE PRINTFONT(F:INTEGER);VAR K:0..NAMESIZE;
BEGIN IF F=NF THEN WRITE(TTY,'UNDEFINED!')ELSE BEGIN FOR K:=FONTNAME[F]
TO FONTNAME[F+1]-1 DO WRITE(TTY,XCHR[NAMES[K]]);END;END;{:42}{43:}
PROCEDURE PRINTEXTENSI(F:INTEGER);VAR M:INTEGER;BEGIN M:=FONTMVAL[F];
WRITE(TTY,'.');WRITE(TTY,XCHR[(M DIV 100)+48]);
WRITE(TTY,XCHR[(M MOD 100)DIV 10+48]);WRITE(TTY,XCHR[M MOD 10+48]);END;
{:43}{45:}FUNCTION FINDGFPOSTAM:BOOLEAN;VAR Q,K:INTEGER;
BEGIN FINDGFPOSTAM:=TRUE;GFPOSTLOC:=GFLENGTH-4;
REPEAT IF GFPOSTLOC=0 THEN FINDGFPOSTAM:=FALSE;MOVETOGFBYTE(GFPOSTLOC);
K:=GFBYTE;GFPOSTLOC:=GFPOSTLOC-1;UNTIL K<>223;
IF K<>131 THEN FINDGFPOSTAM:=FALSE;MOVETOGFBYTE(GFPOSTLOC-3);
Q:=GFSIGNEDQUAD;IF(Q<0)OR(Q>GFPOSTLOC-3)THEN FINDGFPOSTAM:=FALSE;
MOVETOGFBYTE(Q);K:=GFBYTE;IF K<>248 THEN FINDGFPOSTAM:=FALSE;END;{:45}
{46:}PROCEDURE READGFPOSTAM;VAR K,L:INTEGER;P,Q,M,C:INTEGER;
BEGIN GFPOSTLOC:=CURGFLOC-1;P:=GFSIGNEDQUAD;DESIGNSIZE:=GFSIGNEDQUAD;
CHECKSUM:=GFSIGNEDQUAD;HPPP:=GFSIGNEDQUAD;VPPP:=GFSIGNEDQUAD;
MAGNIFICATIO:=HPPP/(65536.0*RESOLUTION/72.27);MINM:=GFSIGNEDQUAD;
MAXM:=GFSIGNEDQUAD;MINN:=GFSIGNEDQUAD;MAXN:=GFSIGNEDQUAD;BC:=MAXCHARNO;
EC:=0;{47:}FOR K:=0 TO 127 DO BEGIN FOR L:=0 TO 3 DO WBYTE[K,L]:=0;
GFPTR[K]:=0;END;{:47};{48:}REPEAT K:=GFBYTE;
IF(K=245)OR(K=246)THEN BEGIN C:=GFBYTE;
IF C>MAXCHARNO THEN BEGIN WRITE(TTY,' ','Character number too large');
JUMPOUT;END;IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
IF K=245 THEN BEGIN DX[C]:=GFSIGNEDQUAD DIV 65536;DY:=GFSIGNEDQUAD;
END ELSE BEGIN DX[C]:=GFBYTE;DY:=0;END;WBYTE[C,0]:=GFBYTE;
WBYTE[C,1]:=GFBYTE;WBYTE[C,2]:=GFBYTE;WBYTE[C,3]:=GFBYTE;
GFPTR[C]:=GFSIGNEDQUAD;K:=244;END;UNTIL K<>244;{:48};
WHILE NOT EOF(GFFILE)DO M:=GFBYTE;END;
FUNCTION FIRSTGFPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63:FIRSTGFPAR:=O-0;
64,71,245,246,239:FIRSTGFPAR:=GFBYTE;65,72,240:FIRSTGFPAR:=GFTWOBYTES;
66,73,241:FIRSTGFPAR:=GFTHREEBYTES;242,243:FIRSTGFPAR:=GFSIGNEDQUAD;
67,68,69,70,244,247,248,249,250,251,252,253,254,255:FIRSTGFPAR:=0;
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,
116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,
206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238:FIRSTGFPAR:=
O-74;END;END;PROCEDURE COPYBYTE;VAR W:EIGHTBITS;BEGIN W:=GFBYTE;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=W;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;END;
PROCEDURE STOWPAIR(W:INTEGER);
BEGIN BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=W DIV 256;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=W MOD 256;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;END;
PROCEDURE STOWSIGNEDPA(W:INTEGER);BEGIN IF W<0 THEN W:=W+65536;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=W DIV 256;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=W MOD 256;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;END;{:46}{51:}
PROCEDURE TABULATE;VAR I,J:INTEGER;BEGIN WRITELN(TTY,'');
WRITELN(TTY,' Contents of the glyph ptr table');WRITE(TTY,' ');
FOR J:=0 TO 9 DO WRITE(TTY,J:7);WRITELN(TTY,'');
FOR I:=0 TO 29 DO BEGIN WRITE(TTY,I*10:3,' ');
FOR J:=0 TO 9 DO WRITE(TTY,GLYPHPTR[10*I+J]:7);WRITELN(TTY,'');END;END;
{:51}{52:}FUNCTION INGF(Z:INTEGER):BOOLEAN;LABEL 9997,9998,9999;
VAR K:INTEGER;LH:INTEGER;NW:INTEGER;WP:0..MAXGLYPHS;ALPHA,BETA:INTEGER;
C:INTEGER;O:INTEGER;P:INTEGER;A:INTEGER;DELM:INTEGER;DELN:INTEGER;
BEGIN IF NOT FINDGFPOSTAM THEN BEGIN WRITELN(TTY,
' Trouble with postamble');GOTO 9997;END;READGFPOSTAM;{53:}
FONTBC[NF]:=BC;FONTEC[NF]:=EC;
IF FONTEC[NF]<FONTBC[NF]THEN FONTBC[NF]:=FONTEC[NF]+1;
IF WIDTHPTR+FONTEC[NF]-FONTBC[NF]+1>MAXGLYPHS THEN BEGIN WRITELN(TTY,
'---not loaded, DVIIMP needs larger width table');GOTO 9998;END;
WP:=WIDTHPTR+FONTEC[NF]-FONTBC[NF]+1;NW:=EC+1-BC;
WRITELN(TTY,' bc=',BC:1,' ec=',EC:1,' nw=',NW:1);
IF(NW=0)OR(NW>256)THEN GOTO 9997;{:53};{56:}{57:}BEGIN ALPHA:=16*Z;
BETA:=16;WHILE Z>=8388608 DO BEGIN Z:=Z DIV 2;BETA:=BETA DIV 2;END;
END{:57};DATABASE[NF]:=WIDTHPTR-BC;WP:=WIDTHPTR+EC-BC+1;C:=BC;
FOR K:=WIDTHPTR TO WP-1 DO BEGIN IF GFPTR[C]=0 THEN BEGIN WIDTH[K]:=
2147483647;PIXELWIDTH[K]:=0;
END ELSE BEGIN WIDTH[K]:=(((((WBYTE[C,3]*Z)DIV 256)+(WBYTE[C,2]*Z))DIV
256)+(WBYTE[C,1]*Z))DIV BETA;
IF WBYTE[C,0]>0 THEN IF WBYTE[C,0]<255 THEN BEGIN WRITELN(TTY,' w byte='
,WBYTE[C,0]:1);GOTO 9997 END ELSE WIDTH[K]:=WIDTH[K]-ALPHA;
PIXELWIDTH[K]:=DX[C];END;C:=C+1;END;{:56};{54:}OPENGFFILE;O:=GFBYTE;
IF O<>247 THEN BEGIN WRITELN(TTY,' GF file does not start with |pre|');
GOTO 9997;END;O:=GFBYTE;
IF O<>131 THEN BEGIN WRITELN(TTY,' id =',O:1,' should be ',131:1);
GOTO 9997;END;O:=GFBYTE;WHILE O>0 DO BEGIN O:=O-1;P:=GFBYTE;END;{:54};
{58:}REPEAT GFPREVPTR:=CURGFLOC;{64:}REPEAT A:=CURGFLOC;O:=GFBYTE;
IF(O=243)THEN BEGIN P:=FIRSTGFPAR(O);O:=244;
END ELSE IF(O>=239)AND(O<=242)THEN BEGIN P:=FIRSTGFPAR(O);
WHILE P>0 DO BEGIN Q:=GFBYTE;P:=P-1;END;O:=244;END;UNTIL O<>244;{:64};
IF(O=67)OR(O=68)THEN BEGIN IF O=67 THEN BEGIN{60:}
TOTALGLYPHS:=TOTALGLYPHS+1;CHARCODE:=GFSIGNEDQUAD;P:=GFSIGNEDQUAD;
C:=CHARCODE MOD 256;IF C<0 THEN C:=C+256;
IF CHARCODE<>C THEN WRITE(TTY,' in family ',(CHARCODE-C)DIV 256:1);
MINM:=GFSIGNEDQUAD;MAXM:=GFSIGNEDQUAD;MINN:=GFSIGNEDQUAD;
MAXN:=GFSIGNEDQUAD;STOWSIGNEDPA(MAXM-MINM+1);STOWSIGNEDPA(-MINM);
STOWSIGNEDPA(MAXN-MINN+1);STOWSIGNEDPA(MAXN);{:60}END ELSE BEGIN{62:}
TOTALGLYPHS:=TOTALGLYPHS+1;CHARCODE:=GFBYTE;P:=-1;C:=CHARCODE;
DELM:=GFBYTE;MAXM:=GFBYTE;DELN:=GFBYTE;MAXN:=GFBYTE;
STOWSIGNEDPA(DELM+1);STOWSIGNEDPA(DELM-MAXM);STOWSIGNEDPA(DELN+1);
STOWSIGNEDPA(MAXN);{:62};END;
GLYPHPTR[DATABASE[NF]+C]:=(NF MOD MMNUM)*MSTORESIZE+SI[NF MOD MMNUM];
{65:}O:=GFBYTE;WHILE O<>69 DO BEGIN A:=CURGFLOC;
WHILE(O<64)OR(O=70)OR((O>=74)AND(O<=238))DO BEGIN BEGIN MSTORE[(NF MOD
MMNUM),SI[(NF MOD MMNUM)]]:=O;SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;
END;O:=GFBYTE;END;
IF(O=64)OR(O=71)THEN BEGIN BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)
]]:=O;SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;P:=GFBYTE;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=P;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;O:=GFBYTE;
END ELSE IF O=239 THEN BEGIN P:=GFBYTE;WHILE P>0 DO BEGIN Q:=GFBYTE;
P:=P-1;END;O:=GFBYTE;END;END;
BEGIN MSTORE[(NF MOD MMNUM),SI[(NF MOD MMNUM)]]:=O;
SI[(NF MOD MMNUM)]:=SI[(NF MOD MMNUM)]+1;END;{:65};END;UNTIL O=248;{:58}
;WIDTHPTR:=WP;INGF:=TRUE;GOTO 9999;
9997:WRITELN(TTY,'---not loaded, GF file is bad');9998:INGF:=FALSE;
9999:END;{:52}{69:}FUNCTION STARTMATCH:BOOLEAN;VAR K:0..9;MATCH:BOOLEAN;
BEGIN MATCH:=TRUE;
FOR K:=0 TO STARTVALS DO IF STARTTHERE[K]AND(STARTCOUNT[K]<>COUNT[K])
THEN MATCH:=FALSE;STARTMATCH:=MATCH;END;{:69}{72:}PROCEDURE INPUTLN;
VAR K:0..TERMINALLINE;BEGIN BREAK(TTY);RESET(TTY);
IF EOLN(TTY)THEN READLN(TTY);K:=0;
WHILE(K<TERMINALLINE)AND NOT EOLN(TTY)DO BEGIN BUFFER[K]:=XORD[TTY↑];
K:=K+1;GET(TTY);END;BUFFER[K]:=32;END;{:72}{74:}
FUNCTION GETINTEGER:INTEGER;VAR X:INTEGER;NEGATIVE:BOOLEAN;
BEGIN IF BUFFER[BUFPTR]=45 THEN BEGIN NEGATIVE:=TRUE;BUFPTR:=BUFPTR+1;
END ELSE NEGATIVE:=FALSE;X:=0;
WHILE(BUFFER[BUFPTR]>=48)AND(BUFFER[BUFPTR]<=57)DO BEGIN X:=10*X+BUFFER[
BUFPTR]-48;BUFPTR:=BUFPTR+1;END;
IF NEGATIVE THEN GETINTEGER:=-X ELSE GETINTEGER:=X;END;{:74}{75:}
PROCEDURE DIALOG;LABEL 1,2,3,4,5;VAR K:INTEGER;BEGIN REWRITE(TTY);
WRITELN(TTY,'This is DVIIMP, Version 0.1');{76:}
1:WRITE(TTY,'Output level (default=2, ? for help): ');OUTMODE:=2;
INPUTLN;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=51)THEN OUTMODE:=
BUFFER[0]-48 ELSE BEGIN WRITE(TTY,'Type 3 for complete listing,');
WRITE(TTY,' 0 for errors only,');
WRITELN(TTY,' 1 or 2 for something in between.');GOTO 1;END{:76};{77:}
2:WRITE(TTY,'Starting page (default=*): ');STARTVALS:=0;
STARTTHERE[0]:=FALSE;INPUTLN;BUFPTR:=0;K:=0;
IF BUFFER[0]<>32 THEN REPEAT IF BUFFER[BUFPTR]=42 THEN BEGIN STARTTHERE[
K]:=FALSE;BUFPTR:=BUFPTR+1;END ELSE BEGIN STARTTHERE[K]:=TRUE;
STARTCOUNT[K]:=GETINTEGER;END;
IF(K<9)AND(BUFFER[BUFPTR]=46)THEN BEGIN K:=K+1;BUFPTR:=BUFPTR+1;
END ELSE IF BUFFER[BUFPTR]=32 THEN STARTVALS:=K ELSE BEGIN WRITE(TTY,
'Type, e.g., 1.*.-5 to specify the ');
WRITELN(TTY,'first page with \count0=1, \count2=-5.');GOTO 2;END;
UNTIL STARTVALS=K{:77};{78:}
3:WRITE(TTY,'Maximum number of pages (default=1000000): ');
MAXPAGES:=1000000;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN BEGIN MAXPAGES:=GETINTEGER;
IF MAXPAGES<=0 THEN BEGIN WRITELN(TTY,'Please type a positive number.');
GOTO 3;END;END{:78};{79:}4:WRITE(TTY,'Assumed device resolution');
WRITE(TTY,' in pixels per inch (default=300/1): ');RESOLUTION:=300.0;
INPUTLN;BUFPTR:=0;IF BUFFER[0]<>32 THEN BEGIN K:=GETINTEGER;
IF(K>0)AND(BUFFER[BUFPTR]=47)AND(BUFFER[BUFPTR+1]>48)AND(BUFFER[BUFPTR+1
]<=57)THEN BEGIN BUFPTR:=BUFPTR+1;RESOLUTION:=K/GETINTEGER;
END ELSE BEGIN WRITE(TTY,'Type a ratio of positive integers;');
WRITELN(TTY,' (1 pixel per mm would be 254/10).');GOTO 4;END;END{:79};
{80:}5:WRITE(TTY,'New magnification (default=0 to keep the old one): ');
NEWMAG:=0;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=57)THEN NEWMAG:=
GETINTEGER ELSE BEGIN WRITE(TTY,'Type a positive integer to override ');
WRITELN(TTY,'the magnification in the DVI file.');GOTO 5;END{:80};{81:}
WRITELN(TTY,'Options selected:');WRITE(TTY,' Starting page = ');
FOR K:=0 TO STARTVALS DO BEGIN IF STARTTHERE[K]THEN WRITE(TTY,STARTCOUNT
[K]:1)ELSE WRITE(TTY,'*');
IF K<STARTVALS THEN WRITE(TTY,'.')ELSE WRITELN(TTY,' ');END;
WRITELN(TTY,' Maximum number of pages = ',MAXPAGES:1);
WRITE(TTY,' Output level = ',OUTMODE:1);CASE OUTMODE OF 0:WRITELN(TTY,
' (showing bops, fonts, and error messages only)');
1:WRITELN(TTY,' (terse)');2:WRITELN(TTY,' (verbose)');
3:IF TRUE THEN WRITELN(TTY,' (the works)')ELSE BEGIN OUTMODE:=2;
WRITELN(TTY,' (the works: same as level 2 in this DVIIMP)');END;END;
WRITELN(TTY,' Resolution = ',RESOLUTION:12:8,' pixels per inch');
IF NEWMAG>0 THEN WRITELN(TTY,' New magnification factor = ',NEWMAG/1000
:8:3){:81};END;{:75}{84:}FUNCTION RECONCILESCA(M:INTEGER):INTEGER;
LABEL 999;VAR I:INTEGER;
BEGIN FOR I:=1 TO 8 DO IF ABS(M-SCALEVAL[I])<ABS(M-SCALEVAL[I+1])THEN
GOTO 999;999:RECONCILESCA:=SCALEVAL[I];END;{:84}{85:}
PROCEDURE MAKESPACEAVA;VAR I,J:INTEGER;BEGIN J:=CURFONT MOD MMNUM;
FOR I:=0 TO MAXGLYPHS DO IF(GLYPHPTR[I]DIV MSTORESIZE)=J THEN IF
GLYPHPTR[I]>0 THEN GLYPHPTR[I]:=0;
FOR I:=0 TO MSTORESIZE DO MSTORE[J,I]:=0;
FOR I:=0 TO MAXFONTS DO IF(I MOD MMNUM)=J THEN FONTSTATE[I]:=-1;
SI[J]:=0;END;{:85}{86:}PROCEDURE DEFINEFONT(E:INTEGER);
VAR F:0..MAXFONTS;P:INTEGER;N:INTEGER;C,Q,D:INTEGER;R:0..NAMELENGTH;
J,K:0..NAMESIZE;M:INTEGER;MISMATCH:BOOLEAN;
BEGIN IF NF=MAXFONTS THEN BEGIN WRITE(TTY,' ',
'DVIIMP capacity exceeded (max fonts=',MAXFONTS:1,')!');JUMPOUT;END;
FONTNUM[NF]:=E;F:=0;WHILE FONTNUM[F]<>E DO F:=F+1;{88:}C:=SIGNEDQUAD;
FONTCHECKSUM[NF]:=C;Q:=SIGNEDQUAD;FONTSCALEDSI[NF]:=Q;D:=SIGNEDQUAD;
FONTDESIGNSI[NF]:=D;P:=GETBYTE;N:=GETBYTE;
IF FONTNAME[NF]+N+P>NAMESIZE THEN BEGIN WRITE(TTY,' ',
'DVIIMP capacity exceeded (name size=',NAMESIZE:1,')!');JUMPOUT;END;
FONTNAME[NF+1]:=FONTNAME[NF]+N+P;
IF SHOWING THEN WRITE(TTY,': ')ELSE IF SHOWFLAG THEN WRITE(TTY,'Font ',E
:1,': ');
IF N+P=0 THEN WRITE(TTY,'null font name!')ELSE FOR K:=FONTNAME[NF]TO
FONTNAME[NF+1]-1 DO NAMES[K]:=GETBYTE;M:=ROUND((0.3*MAG*Q)/D);
IF(M>=ROUND(1.2*RESOLUTION))AND(M<1500)THEN M:=RECONCILESCA(M);
FONTMVAL[NF]:=M;FONTSTATE[NF]:=0;NF:=NF+1;PRINTFONT(NF-1);
PRINTEXTENSI(NF-1);NF:=NF-1{:88};
IF INPOSTAMBLE THEN BEGIN IF F<NF THEN IF SHOWFLAG THEN WRITELN(TTY,
'---this font was already defined!');
END ELSE BEGIN IF F=NF THEN IF SHOWFLAG THEN WRITELN(TTY,
'---this font wasn''t loaded before!');END;IF F=NF THEN{89:}BEGIN{93:}
FOR K:=1 TO NAMELENGTH DO CURNAME[K]:=' ';R:=0;
FOR K:=FONTNAME[NF]+P TO FONTNAME[NF+1]-1 DO IF(K<=FONTNAME[NF]+P+2)OR(K
>=FONTNAME[NF+1]-3)THEN BEGIN R:=R+1;
IF R+4>NAMELENGTH THEN BEGIN WRITE(TTY,' ',
'DVItype capacity exceeded (max font name length=',NAMELENGTH:1,')!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END;M:=FONTMVAL[NF];WRITE(TTY,' m=',M:1);
CURNAME[R+1]:='.';CURNAME[R+2]:=XCHR[M DIV 100+48];
CURNAME[R+3]:=XCHR[(M MOD 100)DIV 10+48];
CURNAME[R+4]:=XCHR[M MOD 10+48];R:=R+4;
IF P=0 THEN FOR K:=1 TO 8 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;CURNAME[R]:=DEFAULTDIREC[K];
END ELSE FOR K:=FONTNAME[NF]TO FONTNAME[NF]+P-1 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(TTY,' ','Font name is too long!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END{:93};OPENGFFILE;
IF EOF(GFFILE)THEN BEGIN NF:=NF+1;PRINTFONT(NF-1);PRINTEXTENSI(NF-1);
NF:=NF-1;
WRITELN(TTY,'---not loaded, GF file can''t be opened!')END ELSE BEGIN IF
(Q<=0)OR(Q>=134217728)THEN WRITE(TTY,'---not loaded, bad scale (',Q:1,
')!')ELSE IF(D<=0)OR(D>=134217728)THEN WRITE(TTY,
'---not loaded, bad design size (',D:1,')!')ELSE IF INGF(Q)THEN{90:}
BEGIN FONTSPACE[NF]:=Q DIV 6;
IF(C<>0)AND(GFCHECKSUM<>0)AND(C<>GFCHECKSUM)THEN BEGIN WRITELN(TTY,
'---beware: check sums do not agree!');
WRITELN(TTY,' (',C:1,' vs. ',GFCHECKSUM:1,')');WRITE(TTY,' ');END;
BEGIN WRITE(TTY,'---loaded at size ',Q:1,' DVI units');
WRITELN(TTY,' with |m_store| at ',(NF MOD MMNUM):1,',',SI[(NF MOD MMNUM)
]:1);END;D:=ROUND((100.0*CONV*Q)/(TRUECONV*D));
IF D<>100 THEN IF SHOWING THEN BEGIN WRITELN(TTY,' ');
WRITE(TTY,' (this font is magnified ',D:1,'%)');END;NF:=NF+1;
FONTSPACE[NF]:=0;END{:90};END;
IF OUTMODE=0 THEN IF SHOWFLAG THEN WRITELN(TTY,' ');END{:89}ELSE{87:}
BEGIN IF FONTCHECKSUM[F]<>C THEN WRITELN(TTY,
'---check sum doesn''t match previous definition!');
IF FONTSCALEDSI[F]<>Q THEN WRITELN(TTY,
'---scaled size doesn''t match previous definition!');
IF FONTDESIGNSI[F]<>D THEN WRITELN(TTY,
'---design size doesn''t match previous definition!');J:=FONTNAME[F];
K:=FONTNAME[NF];MISMATCH:=FALSE;
WHILE J<FONTNAME[F+1]DO BEGIN IF NAMES[J]<>NAMES[K]THEN MISMATCH:=TRUE;
J:=J+1;K:=K+1;END;IF K<>FONTNAME[NF+1]THEN MISMATCH:=TRUE;
IF MISMATCH THEN WRITELN(TTY,
'---font name doesn''t match previous definition!');END{:87};END;{:86}
{96:}FUNCTION READSIGNEDPA(Z:INTEGER):INTEGER;VAR A,B:EIGHTBITS;
BEGIN A:=MSTORE[(CURFONT MOD MMNUM),Z];
B:=MSTORE[(CURFONT MOD MMNUM),Z+1];
IF A<128 THEN READSIGNEDPA:=(A*256)+B ELSE READSIGNEDPA:=(A-256)*256+B;
END;{:96}{97:}PROCEDURE SHOWIT(V:INTEGER);VAR I:INTEGER;
BEGIN FOR I:=1 TO 8 DO IF V>=ATAB[I]THEN BEGIN WRITE(TTY,'*');
V:=V-ATAB[I];END ELSE WRITE(TTY,'.');END;{:97}{98:}
PROCEDURE DOIMBGLY(C:INTEGER);VAR B,DIS,N,I,Q,VAL,W:INTEGER;
BYTESREQUIRE:INTEGER;
BEGIN IF SHOWFLAG THEN WRITELN(TTY,' Mask for character ',C:1);
BEGIN WRITE(IMFILE,199);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(CURFONT*128+C);Q:=PIXELWIDTH[DATABASE[CURFONT]+C];
IMHALFWORD(Q);
Q:=GLYPHPTR[DATABASE[CURFONT]+C]-((CURFONT MOD MMNUM)*MSTORESIZE);
FOR I:=8 DOWNTO 1 DO BEGIN WRITE(IMFILE,MSTORE[(CURFONT MOD MMNUM),Q-I])
;IMBYTENO:=IMBYTENO+1;END;BYTESREQUIRE:=(READSIGNEDPA(Q-8)+7)DIV 8;N:=0;
DIS:=0;VAL:=0;W:=0;WHILE W<>69 DO BEGIN{99:}
WHILE N<BYTESREQUIRE DO BEGIN IF DIS=0 THEN BEGIN{102:}
W:=MSTORE[(CURFONT MOD MMNUM),Q];IF W<=65 THEN BEGIN Q:=Q+1;
IF W=64 THEN BEGIN W:=MSTORE[(CURFONT MOD MMNUM),Q];Q:=Q+1;END;
B:=MSTORE[(CURFONT MOD MMNUM),Q];IF B<=65 THEN BEGIN Q:=Q+1;
IF B=64 THEN BEGIN B:=MSTORE[(CURFONT MOD MMNUM),Q];Q:=Q+1;END;
END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;END ELSE BEGIN B:=0;
W:=8*BYTESREQUIRE;END;{:102};DIS:=W+B;END;
WHILE DIS<8 DO BEGIN VAL:=VAL+BTAB[W]-BTAB[DIS];{102:}
W:=MSTORE[(CURFONT MOD MMNUM),Q];IF W<=65 THEN BEGIN Q:=Q+1;
IF W=64 THEN BEGIN W:=MSTORE[(CURFONT MOD MMNUM),Q];Q:=Q+1;END;
B:=MSTORE[(CURFONT MOD MMNUM),Q];IF B<=65 THEN BEGIN Q:=Q+1;
IF B=64 THEN BEGIN B:=MSTORE[(CURFONT MOD MMNUM),Q];Q:=Q+1;END;
END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;END ELSE BEGIN B:=0;
W:=8*BYTESREQUIRE;END;{:102};W:=DIS+W;DIS:=W+B;END;
IF W>=8 THEN W:=W-8 ELSE BEGIN VAL:=VAL+BTAB[W];W:=0;END;
BEGIN WRITE(IMFILE,VAL);IMBYTENO:=IMBYTENO+1;END;DIS:=DIS-8;VAL:=0;
N:=N+1;END;{:99};W:=MSTORE[(CURFONT MOD MMNUM),Q];
IF(W>=74)AND(W<239)THEN{100:}BEGIN W:=W-74;Q:=Q+1;
B:=MSTORE[(CURFONT MOD MMNUM),Q];IF B<=65 THEN BEGIN Q:=Q+1;
IF B=64 THEN BEGIN B:=MSTORE[(CURFONT MOD MMNUM),Q];Q:=Q+1;END;N:=0;
DIS:=W+B;VAL:=0;END ELSE BEGIN B:=0;W:=8*BYTESREQUIRE;END;N:=0;DIS:=W+B;
VAL:=0;END{:100}ELSE IF(W>=70)AND(W<74)THEN{101:}
BEGIN IF W>70 THEN BEGIN Q:=Q+1;W:=MSTORE[(CURFONT MOD MMNUM),Q];
WHILE W>0 DO BEGIN FOR N:=1 TO BYTESREQUIRE DO BEGIN WRITE(IMFILE,0);
IMBYTENO:=IMBYTENO+1;END;W:=W-1;END;END;Q:=Q+1;N:=0;DIS:=0;VAL:=0;W:=0;
B:=0;END;{:101};END;
GLYPHPTR[DATABASE[CURFONT]+C]:=-GLYPHPTR[DATABASE[CURFONT]+C];
IF SHOWFLAG THEN WRITELN(TTY,'');END;{:98}{105:}PROCEDURE FLUSHTEXT;
VAR K:0..LINELENGTH;
BEGIN IF TEXTPTR>0 THEN BEGIN IF OUTMODE>0 THEN BEGIN WRITE(TTY,'[');
FOR K:=1 TO TEXTPTR DO WRITE(TTY,XCHR[TEXTBUF[K]]);WRITELN(TTY,']');END;
TEXTPTR:=0;END;END;{:105}{106:}PROCEDURE OUTTEXT(C:ASCIICODE);
BEGIN IF TEXTPTR=LINELENGTH-2 THEN FLUSHTEXT;TEXTPTR:=TEXTPTR+1;
TEXTBUF[TEXTPTR]:=C;END;{:106}{111:}
FUNCTION FIRSTPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127:FIRSTPAR:=O
-0;128,133,235,239,243:FIRSTPAR:=GETBYTE;
129,134,236,240,244:FIRSTPAR:=GETTWOBYTES;
130,135,237,241,245:FIRSTPAR:=GETTHREEBYTE;
143,148,153,157,162,167:FIRSTPAR:=SIGNEDBYTE;
144,149,154,158,163,168:FIRSTPAR:=SIGNEDPAIR;
145,150,155,159,164,169:FIRSTPAR:=SIGNEDTRIO;
131,132,136,137,146,151,156,160,165,170,238,242,246:FIRSTPAR:=SIGNEDQUAD
;138,139,140,141,142,247,248,249,250,251,252,253,254,255:FIRSTPAR:=0;
147:FIRSTPAR:=W;152:FIRSTPAR:=X;161:FIRSTPAR:=Y;166:FIRSTPAR:=Z;
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:FIRSTPAR:=O-171;END;END;{:111}
{112:}FUNCTION RULEPIXELS(X:INTEGER):INTEGER;VAR N:INTEGER;
BEGIN N:=TRUNC(CONV*X);
IF N<CONV*X THEN RULEPIXELS:=N+1 ELSE RULEPIXELS:=N;END;{:112}{115:}
{119:}FUNCTION SPECIALCASES(O:EIGHTBITS;P,A:INTEGER):BOOLEAN;
LABEL 46,44,30,9998;VAR Q:INTEGER;K:INTEGER;BADCHAR:BOOLEAN;
PURE:BOOLEAN;VVV:INTEGER;BEGIN PURE:=TRUE;CASE O OF{122:}
157,158,159,160:BEGIN IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV
*(V+P))ELSE VV:=VV+ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','down',O-156:1,' ',P:1);END;GOTO 44;
END;161,162,163,164,165:BEGIN Y:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','y',O-161:1,' ',P:1);END;GOTO 44;END;
166,167,168,169,170:BEGIN Z:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=ROUND(CONV*(V+P))ELSE VV:=VV+
ROUND(CONV*(P));IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','z',O-166:1,' ',P:1);END;GOTO 44;END;{:122}{123:}
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:BEGIN IF OUTMODE>0 THEN BEGIN
FLUSHTEXT;SHOWING:=TRUE;WRITE(TTY,A:1,': ','fntnum',P:1);END;GOTO 46;
END;235,236,237,238:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','fnt',O-234:1,' ',P:1);END;GOTO 46;END;
243,244,245,246:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','fntdef',O-242:1,' ',P:1);END;DEFINEFONT(P);GOTO 30;
END;{:123}239,240,241,242:{124:}BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','xxx ''');END;BADCHAR:=FALSE;
IF P<0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','string of negative length!');
END ELSE WRITE(TTY,' ','string of negative length!');
FOR K:=1 TO P DO BEGIN Q:=GETBYTE;IF(Q<32)OR(Q>126)THEN BADCHAR:=TRUE;
IF SHOWING THEN WRITE(TTY,XCHR[Q]);END;IF SHOWING THEN WRITE(TTY,'''');
IF BADCHAR THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','non-ASCII character in xxx command!');
END ELSE WRITE(TTY,' ','non-ASCII character in xxx command!');GOTO 30;
END{:124};247:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','preamble command within a page!');
END ELSE WRITE(TTY,' ','preamble command within a page!');GOTO 9998;END;
248,249:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','postamble command within a page!');
END ELSE WRITE(TTY,' ','postamble command within a page!');GOTO 9998;
END;OTHERS:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','undefined command ',O:1,'!');
END ELSE WRITE(TTY,' ','undefined command ',O:1,'!');GOTO 30;END END;
44:{130:}
IF(V>0)AND(P>0)THEN IF V>2147483647-P THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','arithmetic overflow! parameter changed from ',P:1,
' to ',2147483647-V:1);
END ELSE WRITE(TTY,' ','arithmetic overflow! parameter changed from ',P:
1,' to ',2147483647-V:1);P:=2147483647-V;END;
IF(V<0)AND(P<0)THEN IF-V>P+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','arithmetic overflow! parameter changed from ',P:1,
' to ',(-V)-2147483647:1);
END ELSE WRITE(TTY,' ','arithmetic overflow! parameter changed from ',P:
1,' to ',(-V)-2147483647:1);P:=(-V)-2147483647;END;
VVV:=ROUND(CONV*(V+P));
IF ABS(VVV-VV)>2 THEN BEGIN IF VVV>VV THEN VV:=VVV-2 ELSE VV:=VVV+2;
VVI:=VV;BEGIN WRITE(IMFILE,137);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(VVI);END;BEGIN WRITE(TTY,' v:=',V:1);
IF P>=0 THEN WRITE(TTY,'+');WRITE(TTY,P:1,'=',V+P:1,', vv:=',VV:1);
WRITE(TTY,' ');END;V:=V+P;
IF ABS(V)>MAXVSOFAR THEN BEGIN IF ABS(V)>MAXV+99 THEN BEGIN IF NOT
SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','warning: |v|>',MAXV:1,'!');
END ELSE WRITE(TTY,' ','warning: |v|>',MAXV:1,'!');MAXV:=ABS(V);END;
MAXVSOFAR:=ABS(V);END;GOTO 30{:130};46:{132:}FONTNUM[NF]:=P;CURFONT:=0;
WHILE FONTNUM[CURFONT]<>P DO CURFONT:=CURFONT+1;
IF CURFONT=NF THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','bad font?');END ELSE WRITE(TTY,' ','bad font?');
BEGIN WRITE(IMFILE,207);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,CURFONT);IMBYTENO:=IMBYTENO+1;END;
IF SHOWFLAG THEN WRITELN(TTY,' family has been changed to ',CURFONT:1);
IF SHOWING THEN BEGIN WRITE(TTY,' current font is ');PRINTFONT(CURFONT);
END;GOTO 30{:132};9998:PURE:=FALSE;30:SPECIALCASES:=PURE;END;{:119}
FUNCTION DOPAGE:BOOLEAN;LABEL 41,42,43,45,30,9998,9999;VAR O:EIGHTBITS;
P,Q:INTEGER;G:INTEGER;A:INTEGER;HHH:INTEGER;BEGIN CURFONT:=NF;S:=0;
H:=ROUND(300/CONV);V:=H;W:=0;X:=0;Y:=0;Z:=0;HH:=ROUND(CONV*(H));
VV:=ROUND(CONV*(V));HHI:=2147483647;VVI:=2147483647;WHILE TRUE DO{117:}
BEGIN A:=CURLOC;SHOWING:=FALSE;O:=GETBYTE;P:=FIRSTPAR(O);
IF EOF(DVIFILE)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'the file ended prematurely','!');JUMPOUT;END;{118:}IF O<128 THEN{125:}
BEGIN IF(O>32)AND(O<=126)THEN BEGIN OUTTEXT(P);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(TTY,A:1,': ','setchar',P:1);END;
END ELSE IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','setchar',P:1);END;GOTO 41;END{:125}
ELSE CASE O OF 128,129,130,131:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','set',O-127:1,' ',P:1);END;GOTO 41;END;
133,134,135,136:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','put',O-132:1,' ',P:1);END;GOTO 41;END;
132:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','setrule');END;GOTO 42;END;
137:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','putrule');END;GOTO 42;END;{120:}
138:BEGIN IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(TTY,A:1,': ','nop');END;GOTO 30;END;
139,68:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','bop occurred before eop!');
END ELSE WRITE(TTY,' ','bop occurred before eop!');GOTO 9998;END;
140:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','eop');END;
IF S<>0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','stack not empty at end of page (level ',S:1,')!');
END ELSE WRITE(TTY,' ','stack not empty at end of page (level ',S:1,')!'
);DOPAGE:=TRUE;IF SHOWFLAG THEN WRITELN(TTY,' ');GOTO 9999;END;
141:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','push');END;IF S=MAXSSOFAR THEN BEGIN MAXSSOFAR:=S+1;
IF S=MAXS THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','deeper than claimed in postamble!');
END ELSE WRITE(TTY,' ','deeper than claimed in postamble!');
IF S=STACKSIZE THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;
WRITE(TTY,A:1,': ','DVIIMP capacity exceeded (stack size=',STACKSIZE:1,
')');
END ELSE WRITE(TTY,' ','DVIIMP capacity exceeded (stack size=',STACKSIZE
:1,')');GOTO 9998;END;END;HSTACK[S]:=H;VSTACK[S]:=V;WSTACK[S]:=W;
XSTACK[S]:=X;YSTACK[S]:=Y;ZSTACK[S]:=Z;HHSTACK[S]:=HH;VVSTACK[S]:=VV;
S:=S+1;SS:=S-1;GOTO 45;END;142:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','pop');END;
IF S=0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','(illegal at level zero)!');
END ELSE WRITE(TTY,' ','(illegal at level zero)!')ELSE BEGIN S:=S-1;
HH:=HHSTACK[S];VV:=VVSTACK[S];H:=HSTACK[S];V:=VSTACK[S];W:=WSTACK[S];
X:=XSTACK[S];Y:=YSTACK[S];Z:=ZSTACK[S];END;SS:=S;GOTO 45;END;{:120}
{121:}143,144,145,146:BEGIN IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[
CURFONT])THEN BEGIN OUTTEXT(32);HH:=ROUND(CONV*(H+P));
END ELSE HH:=HH+ROUND(CONV*(P));IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(TTY,A:1,': ','right',O-142:1,' ',P:1);END;Q:=P;GOTO 43;END;
147,148,149,150,151:BEGIN W:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN BEGIN OUTTEXT(
32);HH:=ROUND(CONV*(H+P));END ELSE HH:=HH+ROUND(CONV*(P));
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(TTY,A:1,': ','w',O-147:1,' ',P:1);END;Q:=P;GOTO 43;END;
152,153,154,155,156:BEGIN X:=P;
IF(P>=FONTSPACE[CURFONT])OR(P<=-4*FONTSPACE[CURFONT])THEN BEGIN OUTTEXT(
32);HH:=ROUND(CONV*(H+P));END ELSE HH:=HH+ROUND(CONV*(P));
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(TTY,A:1,': ','x',O-152:1,' ',P:1);END;Q:=P;GOTO 43;END;{:121}
OTHERS:IF SPECIALCASES(O,P,A)THEN GOTO 30 ELSE GOTO 9998 END{:118};
41:{127:}
IF P<0 THEN P:=255-((-1-P)MOD 256)ELSE IF P>=256 THEN P:=P MOD 256;
IF(P<FONTBC[CURFONT])OR(P>FONTEC[CURFONT])THEN Q:=2147483647 ELSE Q:=
WIDTH[DATABASE[CURFONT]+P];
IF Q=2147483647 THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(TTY,A:1,': ','character ',P:1,' invalid in font ');
END ELSE WRITE(TTY,' ','character ',P:1,' invalid in font ');
PRINTFONT(CURFONT);IF CURFONT<>NF THEN WRITE(TTY,'!');
END ELSE BEGIN G:=GLYPHPTR[DATABASE[CURFONT]+P];
IF SHOWFLAG THEN WRITE(TTY,' (',(CURFONT MOD MMNUM):1,',',GLYPHPTR[
DATABASE[CURFONT]+P]-((CURFONT MOD MMNUM)*MSTORESIZE):1,')');
IF G>0 THEN DOIMBGLY(P);{126:}IF HHI<>HH THEN BEGIN HHI:=HH;
BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:126};
BEGIN WRITE(IMFILE,P);IMBYTENO:=IMBYTENO+1;END;
HHI:=HHI+PIXELWIDTH[DATABASE[CURFONT]+P];END;IF O>=133 THEN GOTO 30;
IF Q=2147483647 THEN Q:=0 ELSE HH:=HH+PIXELWIDTH[DATABASE[CURFONT]+P];
GOTO 43{:127};42:{128:}Q:=SIGNEDQUAD;
IF SHOWING THEN BEGIN WRITE(TTY,' height ',P:1,', width ',Q:1);
IF(P<=0)OR(Q<=0)THEN WRITE(TTY,' (invisible)')ELSE WRITE(TTY,' (',
RULEPIXELS(P):1,'x',RULEPIXELS(Q):1,' pixels)');END;{126:}
IF HHI<>HH THEN BEGIN HHI:=HH;BEGIN WRITE(IMFILE,135);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(HH);END;
IF VVI<>VV THEN BEGIN VVI:=VV;BEGIN WRITE(IMFILE,137);
IMBYTENO:=IMBYTENO+1;END;IMHALFWORD(VV);END;{:126};
BEGIN WRITE(IMFILE,193);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(RULEPIXELS(Q));IMHALFWORD(RULEPIXELS(P));
IMHALFWORD(RULEPIXELS(-P));IF O=137 THEN GOTO 30;
IF SHOWING THEN WRITELN(TTY,' ');HH:=HH+RULEPIXELS(Q);GOTO 43{:128};
43:{129:}
IF(H>0)AND(Q>0)THEN IF H>2147483647-Q THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','arithmetic overflow! parameter changed from ',Q:1,
' to ',2147483647-H:1);
END ELSE WRITE(TTY,' ','arithmetic overflow! parameter changed from ',Q:
1,' to ',2147483647-H:1);Q:=2147483647-H;END;
IF(H<0)AND(Q<0)THEN IF-H>Q+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','arithmetic overflow! parameter changed from ',Q:1,
' to ',(-H)-2147483647:1);
END ELSE WRITE(TTY,' ','arithmetic overflow! parameter changed from ',Q:
1,' to ',(-H)-2147483647:1);Q:=(-H)-2147483647;END;
HHH:=ROUND(CONV*(H+Q));
IF ABS(HHH-HH)>2 THEN BEGIN IF HHH>HH THEN HH:=HHH-2 ELSE HH:=HHH+2;
HHI:=HH;BEGIN WRITE(IMFILE,135);IMBYTENO:=IMBYTENO+1;END;
IMHALFWORD(HHI);END;BEGIN WRITE(TTY,' h:=',H:1);
IF Q>=0 THEN WRITE(TTY,'+');WRITE(TTY,Q:1,'=',H+Q:1,', hh:=',HH:1);
WRITE(TTY,', hhi:=',HHI:1);WRITE(TTY,' ');END;H:=H+Q;
IF ABS(H)>MAXHSOFAR THEN BEGIN IF ABS(H)>MAXH+99 THEN BEGIN IF NOT
SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(TTY,A:1,': ','warning: |h|>',MAXH:1,'!');
END ELSE WRITE(TTY,' ','warning: |h|>',MAXH:1,'!');MAXH:=ABS(H);END;
MAXHSOFAR:=ABS(H);END;GOTO 30{:129};45:{131:}
IF SHOWING THEN BEGIN WRITELN(TTY,' ');
WRITE(TTY,'level ',SS:1,':(h=',H:1,',v=',V:1,',w=',W:1,',x=',X:1,',y=',Y
:1,',z=',Z:1,',hh=',HH:1,',vv=',VV:1,')');END;GOTO 30{:131};
30:IF SHOWING THEN WRITELN(TTY,' ');END{:117};9998:WRITELN(TTY,'!');
DOPAGE:=FALSE;9999:BEGIN WRITE(IMFILE,219);IMBYTENO:=IMBYTENO+1;END;END;
{:115}{116:}PROCEDURE NEXTPAGE;VAR P:INTEGER;K:0..255;
BEGIN MOVETOBYTE(NEWBACKPOINT);K:=GETBYTE;
IF K=139 THEN BEGIN FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
NEWBACKPOINT:=SIGNEDQUAD;
IF SHOWFLAG THEN WRITELN(TTY,' In next_page first_backpointer=',
FIRSTBACKPOI:1);END;
IF NOT DOPAGE THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'page ended unexpectedly','!');JUMPOUT;END;
WRITE(TTY,'[',COUNT[0]:1,'] ');END;{:116}{133:}PROCEDURE SKIPPAGES;
LABEL 9999;VAR P:INTEGER;K:0..255;DOWNTHEDRAIN:INTEGER;
BEGIN SHOWING:=FALSE;
WHILE TRUE DO BEGIN IF EOF(DVIFILE)THEN BEGIN WRITE(TTY,' ',
'Bad DVI file: ','the file ended prematurely','!');JUMPOUT;END;
K:=GETBYTE;P:=FIRSTPAR(K);CASE K OF 139:BEGIN{136:}
NEWBACKPOINT:=CURLOC-1;PAGECOUNT:=PAGECOUNT+1;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN(TTY,'backpointer in byte ',
CURLOC-4:1,' should be ',OLDBACKPOINT:1,'!');
OLDBACKPOINT:=NEWBACKPOINT{:136};
IF NOT STARTED AND STARTMATCH THEN BEGIN STARTED:=TRUE;END;END;
132,137:DOWNTHEDRAIN:=SIGNEDQUAD;243,244,245,246:BEGIN DEFINEFONT(P);
IF SHOWFLAG THEN WRITELN(TTY,' ');END;
239,240,241,242:WHILE P>0 DO BEGIN DOWNTHEDRAIN:=GETBYTE;P:=P-1;END;
248:BEGIN INPOSTAMBLE:=TRUE;GOTO 9999;END;OTHERS:END;END;9999:END;{:133}
{141:}PROCEDURE READPOSTAMBL;VAR K:INTEGER;P,Q,M:INTEGER;
BEGIN SHOWING:=FALSE;POSTLOC:=CURLOC-5;
IF SHOWFLAG THEN WRITELN(TTY,' mstore indexes at ',(CURFONT MOD MMNUM):1
,',',SI[(CURFONT MOD MMNUM)]:1);
IF SHOWFLAG THEN WRITELN(TTY,'Postamble starts at byte ',POSTLOC:1,'.');
IF SIGNEDQUAD<>NUMERATOR THEN WRITELN(TTY,
'numerator doesn''t match the preamble!');
IF SIGNEDQUAD<>DENOMINATOR THEN WRITELN(TTY,
'denominator doesn''t match the preamble!');
IF SIGNEDQUAD<>MAG THEN IF NEWMAG=0 THEN WRITELN(TTY,
'magnification doesn''t match the preamble!');MAXV:=SIGNEDQUAD;
MAXH:=SIGNEDQUAD;WRITE(TTY,'maxv=',MAXV:1,', maxh=',MAXH:1);
MAXS:=GETTWOBYTES;TOTALPAGES:=GETTWOBYTES;
WRITELN(TTY,', maxstackdepth=',MAXS:1,', totalpages=',TOTALPAGES:1);
IF OUTMODE<3 THEN{142:}BEGIN IF MAXV+99<MAXVSOFAR THEN WRITELN(TTY,
'warning: observed maxv was ',MAXVSOFAR:1);
IF MAXH+99<MAXHSOFAR THEN WRITELN(TTY,'warning: observed maxh was ',
MAXHSOFAR:1);IF MAXS<MAXSSOFAR THEN WRITELN(TTY,
'warning: observed maxstackdepth was ',MAXSSOFAR:1);
IF PAGECOUNT<>TOTALPAGES THEN WRITELN(TTY,'there are really ',PAGECOUNT:
1,' pages, not ',TOTALPAGES:1,'!');END{:142};{144:}REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);
WRITELN(TTY,' ');K:=138;END;UNTIL K<>138;
IF K<>249 THEN WRITELN(TTY,'byte ',CURLOC-1:1,' is not postpost!'){:144}
;{143:}Q:=SIGNEDQUAD;
IF Q<>POSTLOC THEN WRITELN(TTY,'bad postamble pointer in byte ',CURLOC-4
:1,'!');M:=GETBYTE;
IF M<>2 THEN WRITELN(TTY,'identification in byte ',CURLOC-1:1,
' should be ',2:1,'!');K:=CURLOC;M:=223;
WHILE(M=223)AND NOT EOF(DVIFILE)DO M:=GETBYTE;
IF NOT EOF(DVIFILE)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'signature in byte ',CURLOC-1:1,' should be 223','!');JUMPOUT;
END ELSE IF CURLOC<K+4 THEN WRITELN(TTY,
'not enough signature bytes at end of file (',CURLOC-K:1,')');{:143};
END;{:141}{145:}BEGIN INITIALIZE;{147:}OPENDVIFILE;P:=GETBYTE;
IF P<>247 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'First byte isn''t start of preamble!','!');JUMPOUT;END;P:=GETBYTE;
IF P<>2 THEN WRITELN(TTY,'identification in byte 1 should be ',2:1,'!');
{148:}NUMERATOR:=SIGNEDQUAD;DENOMINATOR:=SIGNEDQUAD;
IF NUMERATOR<=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'numerator is ',NUMERATOR:1,'!');JUMPOUT;END;
IF DENOMINATOR<=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'denominator is ',DENOMINATOR:1,'!');JUMPOUT;END;
IF SHOWFLAG THEN WRITELN(TTY,'numerator/denominator=',NUMERATOR:1,'/',
DENOMINATOR:1);CONV:=(NUMERATOR/254000.0)*(RESOLUTION/DENOMINATOR);
MAG:=SIGNEDQUAD;
IF NEWMAG>0 THEN MAG:=NEWMAG ELSE IF MAG<=0 THEN BEGIN WRITE(TTY,' ',
'Bad DVI file: ','magnification is ',MAG:1,'!');JUMPOUT;END;
TRUECONV:=CONV;CONV:=TRUECONV*(MAG/1000.0);
IF SHOWFLAG THEN WRITELN(TTY,'magnification=',MAG:1,'; ',CONV:16:8,
' pixels per DVI unit'){:148};IDLEN:=GETBYTE;P:=0;
WHILE P<IDLEN DO BEGIN P:=P+1;ID[P]:=GETBYTE;END;{:147};OPENIMFILE;
BEGIN WRITE(IMFILE,64);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,100);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,111);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,99);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,117);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,116);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,40);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,108);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,97);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,103);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,117);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,97);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,103);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,105);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,80);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,115);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,115);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,79);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,119);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,110);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,114);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,32);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;CALLI(20,0,0,PPN.INT,SUCCESS);
FOR DVINLEN:=1 TO 6 DO BEGIN WRITE(IMFILE,PPN.SIXBIT[DVINLEN]+32);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,44);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,78);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,97);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,109);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,101);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);
IMBYTENO:=IMBYTENO+1;END;CURNAM(DVIFILE,DVINAME);DVINLEN:=1;
WHILE ORD(DVINAME[DVINLEN])<>0 DO BEGIN BEGIN WRITE(IMFILE,XORD[DVINAME[
DVINLEN]]);IMBYTENO:=IMBYTENO+1;END;DVINLEN:=DVINLEN+1;END;
BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,44);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,68);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,86);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,73);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,45);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,105);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,100);IMBYTENO:=IMBYTENO+1;END;
BEGIN WRITE(IMFILE,32);IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);
IMBYTENO:=IMBYTENO+1;END;FOR P:=0 TO IDLEN DO BEGIN WRITE(IMFILE,ID[P]);
IMBYTENO:=IMBYTENO+1;END;BEGIN WRITE(IMFILE,34);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,41);IMBYTENO:=IMBYTENO+1;END;
IF OUTMODE=3 THEN BEGIN{137:}N:=DVILENGTH;
IF N<53 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','only ',N:1,
' bytes long','!');JUMPOUT;END;M:=N-4;
REPEAT IF M=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','all 223s','!');
JUMPOUT;END;MOVETOBYTE(M);K:=GETBYTE;M:=M-1;UNTIL K<>223;
IF K<>2 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','ID byte is ',K:1,'!')
;JUMPOUT;END;MOVETOBYTE(M-3);Q:=SIGNEDQUAD;
IF(Q<0)OR(Q>M-33)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'post pointer ',Q:1,' at byte ',M-3:1,'!');JUMPOUT;END;MOVETOBYTE(Q);
K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;POSTLOC:=Q;FIRSTBACKPOI:=SIGNEDQUAD;
IF SHOWFLAG THEN WRITELN(TTY,' first_backpointer=',FIRSTBACKPOI:1){:137}
;INPOSTAMBLE:=TRUE;READPOSTAMBL;INPOSTAMBLE:=FALSE;{139:}Q:=POSTLOC;
P:=FIRSTBACKPOI;STARTLOC:=-1;
IF P<0 THEN INPOSTAMBLE:=TRUE ELSE BEGIN REPEAT IF P>Q-46 THEN BEGIN
WRITE(TTY,' ','Bad DVI file: ','page link ',P:1,' after byte ',Q:1,'!');
JUMPOUT;END;Q:=P;MOVETOBYTE(Q);K:=GETBYTE;
IF K=139 THEN PAGECOUNT:=PAGECOUNT+1 ELSE BEGIN WRITE(TTY,' ',
'Bad DVI file: ','byte ',Q:1,' is not bop','!');JUMPOUT;END;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;IF STARTMATCH THEN STARTLOC:=Q;
P:=SIGNEDQUAD;UNTIL P<0;IF STARTLOC<0 THEN BEGIN WRITE(TTY,' ',
'starting page number could not be found!');JUMPOUT;END;
MOVETOBYTE(STARTLOC+1);OLDBACKPOINT:=STARTLOC;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;P:=SIGNEDQUAD;STARTED:=TRUE;END;
IF PAGECOUNT<>TOTALPAGES THEN WRITELN(TTY,'there are really ',PAGECOUNT:
1,' pages, not ',TOTALPAGES:1,'!'){:139};IF NOT INPOSTAMBLE THEN{149:}
BEGIN WHILE MAXPAGES>0 DO BEGIN MAXPAGES:=MAXPAGES-1;WRITELN(TTY,' ');
WRITE(TTY,CURLOC-45:1,': beginning of page ');
FOR K:=0 TO STARTVALS DO BEGIN WRITE(TTY,COUNT[K]:1);
IF K<STARTVALS THEN WRITE(TTY,'.')ELSE WRITELN(TTY,' ');END;
IF NOT DOPAGE THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'page ended unexpectedly','!');JUMPOUT;END;REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);K:=138;END;
UNTIL K<>138;IF K=248 THEN BEGIN INPOSTAMBLE:=TRUE;GOTO 30;END;
IF K<>139 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','byte ',CURLOC-1:1,
' is not bop','!');JUMPOUT;END;{136:}NEWBACKPOINT:=CURLOC-1;
PAGECOUNT:=PAGECOUNT+1;FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN(TTY,'backpointer in byte ',
CURLOC-4:1,' should be ',OLDBACKPOINT:1,'!');
OLDBACKPOINT:=NEWBACKPOINT{:136};END;30:END{:149};END ELSE SKIPPAGES;
IF OUTMODE<3 THEN BEGIN{140:}N:=DVILENGTH;
IF N<53 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','only ',N:1,
' bytes long','!');JUMPOUT;END;M:=N-4;
REPEAT IF M=0 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','all 223s','!');
JUMPOUT;END;MOVETOBYTE(M);K:=GETBYTE;M:=M-1;UNTIL K<>223;
IF K<>2 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','ID byte is ',K:1,'!')
;JUMPOUT;END;MOVETOBYTE(M-3);Q:=SIGNEDQUAD;
IF(Q<0)OR(Q>M-33)THEN BEGIN WRITE(TTY,' ','Bad DVI file: ',
'post pointer ',Q:1,' at byte ',M-3:1,'!');JUMPOUT;END;MOVETOBYTE(Q);
K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(TTY,' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;POSTLOC:=Q;FIRSTBACKPOI:=SIGNEDQUAD;
NEWBACKPOINT:=FIRSTBACKPOI;
IF SHOWFLAG THEN WRITELN(TTY,' first_backpointer=',FIRSTBACKPOI:1);
WHILE NEWBACKPOINT<>-1 DO NEXTPAGE;
WHILE IMBYTENO MOD 4<>3 DO BEGIN WRITE(IMFILE,254);IMBYTENO:=IMBYTENO+1;
END;BEGIN WRITE(IMFILE,255);IMBYTENO:=IMBYTENO+1;END;{:140};END;
9999:END.{:145}